home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Unix / CNews / Source / inject / defaults.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-09-25  |  3.8 KB  |  213 lines

  1. /*
  2.  * defaults - generate default values for headers.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <ctype.h>
  7. #include <string.h>
  8. #include <pwd.h>
  9. #include <sys/types.h>
  10. #include "news.h"
  11. #include "config.h"
  12. #include "fgetmfs.h"
  13.  
  14. /* imports */
  15. extern int optind;
  16. extern char *optarg;
  17. extern FILE *efopen();
  18. extern char *getenv(), *getlogin();
  19. extern char *emalloc();
  20. extern struct passwd *getmypwent();
  21. extern time_t time();
  22.  
  23. /* exports */
  24. char *progname = "";
  25. int debug;
  26.  
  27. /* forwards */
  28. char *fullname(), *readline(), *getdomain(), *getuserid(), *getfullname();
  29. char *getorg();
  30.  
  31. /* privates */
  32. int usggcos;            /* strictly speaking, "BTL RJE format" */
  33. time_t now;
  34. long pid;
  35.  
  36. /*
  37.  * main - parse arguments and handle options
  38.  */
  39. main(argc, argv)
  40. int argc;
  41. char *argv[];
  42. {
  43.     int c, errflg = 0;
  44.  
  45.     if (argc > 0)
  46.         progname = argv[0];
  47.     while ((c = getopt(argc, argv, "dp:t:u")) != EOF)
  48.         switch (c) {
  49.         case 'd':
  50.             ++debug;
  51.             break;
  52.         case 'p':
  53.             pid = atol(optarg);
  54.             break;
  55.         case 't':
  56.             now = atol(optarg);
  57.             break;
  58.         case 'u':
  59.             usggcos++;
  60.             break;
  61.         default:
  62.             errflg++;
  63.             break;
  64.         }
  65.     if (errflg || optind < argc) {
  66.         (void) fprintf(stderr, "usage: %s [-du] [-p pid] [-t time]\n",
  67.             progname);
  68.         exit(2);
  69.     }
  70.  
  71.     getdefaults();
  72.     exit(0);
  73. }
  74.  
  75. getdefaults()
  76. {
  77.     register char *name, *domain, *org;
  78.     register struct passwd *pwp = getmypwent();
  79.  
  80.     printvar("defhostname", hostname());
  81.     domain = getdomain();
  82.     printvar("defmailname", domain);
  83.     printvar("defuser", getuserid(pwp));
  84.     name = getfullname(pwp);
  85.     printvar("defname", name);
  86.     free(name);
  87.     org = getorg();
  88.     printvar("deforg", org);
  89.     free(org);
  90.  
  91.     /* compute message-id */
  92.     (void) fputs("defmsgid", stdout);
  93.     (void) putchar('=');
  94.     (void) putchar('\'');
  95.  
  96.     (void) putchar('<');
  97.     intcode(now == 0? time(&now): now);
  98.     (void) putchar('.');
  99.     intcode((time_t)(pid == 0? getpid(): pid));
  100.     (void) putchar('@');
  101.     (void) fputs(domain, stdout);
  102.     (void) putchar('>');
  103.  
  104.     (void) putchar('\'');
  105.     (void) putchar('\n');
  106. }
  107.  
  108. char *                            /* malloced */
  109. getdomain()
  110. {
  111.     register char *line, *name;
  112.  
  113.     line = readline(ctlfile("mailname"));
  114.     if (line != NULL) {
  115.         register char *s;
  116.  
  117.         for (s = line; *s != '\0'; s++)
  118.             if (*s == '\t')
  119.                 *s = ' ';
  120.     } else {
  121.         line = strsave(hostname());
  122.         if (strchr(line, '.') == NULL) { /* not internet addr.? */
  123.             name = str3save(line, ".uucp", "");
  124.             free(line);
  125.             line = name;
  126.         }
  127.     }
  128.     return line;
  129. }
  130.  
  131. char *                        /* static */
  132. getuserid(pwp)
  133. register struct passwd *pwp;
  134. {
  135.     register char *name;
  136.  
  137.     name = getenv("LOGNAME");
  138.     if (name == NULL)
  139.         name = getenv("USER");
  140.     if (name == NULL)
  141.         name = (pwp == NULL? "nobody": pwp->pw_name);
  142.     return name;
  143. }
  144.  
  145. char *                        /* malloced */
  146. getfullname(pwp)
  147. register struct passwd *pwp;
  148. {
  149.     register char *line, *name;
  150.  
  151.     name = getenv("NAME");
  152.     if (name != NULL)
  153.         return strsave(name);
  154.     else {
  155.         name = str3save(getenv("HOME"), "/", ".name");
  156.         line = readline(name);
  157.         free(name);
  158.         name = (line != NULL? line: strsave(fullname(pwp, usggcos)));
  159.     }
  160.     return name;
  161. }
  162.  
  163. char *                        /* malloced */
  164. getorg()
  165. {
  166.     register char *line;
  167.  
  168.     line = getenv("ORGANIZATION");
  169.     if (line != NULL)
  170.         return strsave(line);
  171.     else {
  172.         line = readline(ctlfile("organization"));    /* american */
  173.         if (line == NULL)
  174.             line = readline(ctlfile("organization")); /* english */
  175.         if (line == NULL)
  176.             line = strsave("");
  177.     }
  178.     return line;
  179. }
  180.  
  181. char *                        /* malloced */
  182. readline(file)
  183. char *file;
  184. {
  185.     register FILE *fp = fopen(file, "r");
  186.     register char *line;
  187.  
  188.     if (fp == NULL)
  189.         return NULL;
  190.     line = fgetms(fp);
  191.     (void) fclose(fp);
  192.     if (line != NULL)
  193.         trim(line);
  194.     return line;
  195. }
  196.  
  197. printvar(var, value)        /* print var='value' with suitable sh quoting */
  198. register char *var, *value;
  199. {
  200.     (void) fputs(var, stdout);
  201.     (void) putchar('=');
  202.     if (*value != '\0') {
  203.         (void) putchar('\'');
  204.         for (; *value != '\0'; value++)
  205.             if (*value == '\'')
  206.                 (void) fputs("'\\''", stdout);
  207.             else
  208.                 (void) putchar(*value);
  209.         (void) putchar('\'');
  210.     }
  211.     (void) putchar('\n');
  212. }
  213.